/**
 * utiles.h
 *
 *  Created on: 27/12/2009
 *      Author: San Martín, Matías I.
 */

#ifndef UTILES_H_
#define UTILES_H_

#include <string>
#include <sstream>
#include <map>
#include <fstream>

#include <signal.h>

using std::string;
using std::ostringstream;
using std::istringstream;
using std::ifstream;
using std::map;

#define WHITESPACES " \t\f\v\n\r"

#define forever for(;;)

typedef map<string, string> config_t;

class Utiles
{
public:
	// Permite convertir cualquier tipo basico a string
	template <typename T>
	static string toString(const T &t){
		ostringstream ss;
		ss << t;
		return ss.str();
	}
	// Lo inverso: Convierte de string a tipo basico
	template <typename T>
	static T fromString(const string &s){
		istringstream ss(s);
		T t;
		ss >> t;
		return t;
	}

	/**
	 * Elimina los espacios al comienzo y al final de un string.
	 */
	static void chop(std::string& s) {
	    s.erase(0, s.find_first_not_of(WHITESPACES));
	    s.erase(s.find_last_not_of(WHITESPACES)+1);
	}

	/**
	 * Carga la configuración de un archivo de texto.
	 */
	static bool load_config(const string& filename, config_t& config) {
	    ifstream file(filename.c_str());
	    string line, key, value;
	    int pos;

	    if(!file.good()) {
	        return false;
	    }

	    getline(file, line);
	    while(file.good()) {
	        chop(line);

	        if(!line.empty() && line.at(0)!='#') {
	            pos = line.find("=");
	            key = line.substr(0, pos);
	            value = line.substr(pos+1);

	            chop(key);
	            chop(value);

	            config[key] = value;
	        }

	        getline(file, line);
	    }

//		DEBUG! imprime por pantalla la configuración cargada del archivo
//		map<U, V>::iterator it = config.begin();
//		for(;it!=config.end(); it++) {
//			log << (*it).first << "=" << (*it).second << log.endl;
//		}

	    return true;
	}

	/**
	 * Registra f como la función de callback de la señal s.
	 */
	static void registrar_signal(int s, void (*f)(int)) {
	    struct sigaction act;

	    act.sa_handler = f;
	    act.sa_flags = 0;
	    sigemptyset(&act.sa_mask);

	    sigaction(s, &act, NULL);
	}
};

#endif /* UTILES_H_ */
